

/**
 * NoSQL数据库的诞生原因
 * session存在哪（会话控制）Session对象存储特定用户会话所需的属性及配置信息
 *    1.cookie（饼干）中（cookie在客户端中）
 *        不安全（在客户端中）   网络负担效率低（cookie会带来带去）
 *    2:存在文件服务器或者数据库里
 *          大量的I0效率问题
 *    3.session复制 （把session的信息保存后  复制到所有服务器上）
 *          session数据冗余     节点越多浪费越大
 *    4.缓存数据库  如 redis （先查看缓存数据库Cache（高速缓存）
 *     （NoSQL数据库 ）            没有再查看数据库 后保存到缓存数据库中再返回）
 *          完全在内存中,速度快      减少IO读操作
 *          数据结构简单      减少cpu和IO压力
 */

/**
 * NoSQL数据库概述
 * ●NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”，
 * 泛指非关系型的数据库。
 * ●NoSQL不依赖业务逻辑方式存储,而以简单的  key-value  模式存储。
 * 因此大大的增加了数据库的扩展能力。
 * ●不遵循SQL标准。
 * ●不支持ACID。
 *   //事务具有4个特征，分别是原子性、一致性、隔离性和持久性，
 *     简称事务的ACID特性
 * ●远超于SQL的性能。
 *
 * NoSQL适用场景
 * ●对数据高并发的读写
 * ●海量数据的读写
 * ●对数据高可扩展性的
 * NoSQL不适用场景
 * ●需要事务支持
 * ●基于sql的结构化查询存储，处理复杂的关系，需要即席查询(条件查询)。
 */


/**
 * 几种非关系型数据库
 * ➢ Memcache
 * ●很早出现的NoSql数据库
 * ●数据都在内存中，-般不持久化
 * ●支持简单的key-value模式  类型单一
 * ●一般是作为缓存 数据库辅助持久化的数据库
 *
 * ➢ Redis
 * ●几乎覆盖了Memcached的绝大部分功能
 * ●数据都在内存中，支持持久化，主要用作备份恢复
 * ●除了支持简单的key-value模式，还支持多种数据结
 *  构的存储，比如list、 set、 hash、 zset等。
 * ●一般是作为缓存数据库辅助持久化的数据库
 *
 * ➢mongoDB
 * ●高性能、开源、模式自由(schema free)的文档型数据库
 * ●数据都在内存中，如果内存不足,（他是一个环形队列）
 * ●虽然是key-value模式，但是对value (尤其是json) 提供把不常用的数据保存
 *   到硬盘了丰富的查询功能
 * ●支持二进制数据及大型对象（如图片）
 * ●可以根据数据的特点替代RDBMS，成为独立的数据库。或者配合RDBMS ,

 * ➢HBase
 * HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随
 * 机、实时的读写操作的场景中。HBase的目标就是处理数据量非常
 * 庞大的表，可以用普通的计算机处理超过10亿行数据，还可处理
 * 有数百万列元素的数据表。
 * ➢Cassandra
 * Apache Cassandra是一款免费的开源NoSQL 数据库,其设计目的在于
 * 管理由大量商用服务器构建起来的庞大集群.上的海量数据集(数据量
 * 通常达到PB（k->m->g->t->p）级别)。在众多显著特性当中，Cassandra最 为卓越的长
 * 处是对写入及读取操作进行规模调整，而且其不强调主集群的设计
 * 思路能够以相对直观的方式简化各集群的创建与扩展流程。下没有难学
 * ➢Neo4j //图关系数据库
 * 主要应用:社会关系,公共交通网络,地图及网络拓谱
 *
 */

public class Main {//redis默认端口 6379        linux：6379
    public static void main(String[] args) {

        /**
         * Redis是一个开源的key-value存储系统。
         * 和Memcached类似 ,它支持存储的value类型相对更多，
         * 包括string(字符串)、list(链表)、set(集合)、
         * zset(sorted set --有序集合)和hash (哈希类型)。
         * 这些数据类型都支持push/pop、add/remove及
         * 取交集并集和差集及更丰富的操作，
         * 而且这些操作都是原子性的。
         * 在此基础上，Redis支持各种不同方式的排序。
         * 与memcached- 样，为了保证效率，数据都是缓存在内存中。
         * 区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件，
         * 并且在此基础上实现了master-slave(主从)同步。
         */

        /**
         * 2、由于其拥有持久化能力,利用其多样的数据结构存储特定的数据。
         * 最新N个数据                    通过List实现按自然时间排序的数据
         * 排行榜，Top N,                 利用zset(有序集合)
         * 时效性的数据，比如手机验证码       Expire过期
         * 计数器，秒杀                    原子性，自增方法INCR、DECR
         * 去除大量数据中的重复数据          利用Set集合
         * 构建队列                       利用list集合
         * 发布订阅消息系统                 pub/sub模式
         */

        /**
         * Redis是单线程+多路I0复用技术
         *    多路复用是指使用一个线程来检查多个文件描述符(Socket)
         *    的就绪状态，比如调用select和poll函数，传入多个文件描述符，
         *    如果有一个文件描述符就绪，则返回，否则阻塞直到超时。
         *    得到就绪状态后进行真正的操作可以在同一个线程里执行，
         *    也可以启动线程执行(比如使用线程池)
         *
         * 串行vs多线程+锁(memcached) vs 单线程+多路I0复用(Redis)
         *
         * I0复用技术：
         *    select:只要有信息 就会询问      最多同时监视1024个
         *    poll：只要有信息 就会询问       数量无限制
         *    epoll：他自带标识符 不需要询问   数量无限制
         *
         * Redis单命令的原子性主要得益于Redis的单线程
         */

        /**
         * 一.Redis的高并发和快速原因
         * 1.redis是基于内存的，内存的读写速度非常快；
         * 2.redis是单线程的，省去了很多上下文切换线程的时间；
         * 3.redis使用多路复用技术，可以处理并发的连接。非阻塞IO 内部实现采用epoll，
         *   采用了epoll+自己实现的简单的事件框架。
         *   epoll中的读、写、关闭、连接都转化成了事件，然后利用epoll的多路复用特性，
         *   绝不在io上浪费一点时间。
         *二.为什么Redis是单线程的
         * 1.官方答案
         *   因为Redis是基于内存的操作，CPU不是Redis的瓶颈，
         *   Redis的瓶颈最有可能是机器内存的大小或者网络带宽。
         *   既然单线程容易实现，而且CPU不会成为瓶颈，那就顺理成章地采用单线程的方案了。
         * 2.性能指标
         *  关于redis的性能，官方网站也有，普通笔记本轻松处理每秒几十万的请求。
         * 3.详细原因
         * 1）不需要各种锁的性能消耗
         *   Redis的数据结构并不全是简单的Key-Value，还有list，hash等复杂的结构，
         *   这些结构有可能会进行很细粒度的操作，比如在很长的列表后面添加一个元素，
         *   在hash当中添加或者删除一个对象。这些操作可能就需要加非常多的锁，导致的结果是同步开销大大增加。
         *   总之，在单线程的情况下，就不用去考虑各种锁的问题，
         *   不存在加锁释放锁操作，没有因为可能出现死锁而导致的性能消耗。
         * 2）单线程多进程集群方案
         *   单线程的威力实际上非常强大，每核心效率也非常高，
         *   多线程自然是可以比单线程有更高的性能上限，但是在今天的计算环境中，
         *   即使是单机多线程的上限也往往不能满足需要了，需要进一步摸索的是多服务器集群化的方案，
         *   这些方案中多线程的技术照样是用不上的。
         *   所以单线程、多进程的集群不失为一个时髦的解决方案。
         * 3）CPU消耗
         *   采用单线程，避免了不必要的上下文切换和竞争条件，也不存在多进程或者多线程导致的切换而消耗 CPU。
         *   但是如果CPU成为Redis瓶颈，或者不想让服务器其他CUP核闲置，那怎么办？
         *   可以考虑多起几个Redis进程，Redis是key-value数据库，不是关系数据库，数据之间没有约束。
         *   只要客户端分清哪些key放在哪个Redis进程上就可以了。
         * 回到顶部
         * 三.Redis单线程的优劣势
         * 1.单进程单线程优势
         * 代码更清晰，处理逻辑更简单
         * 不用去考虑各种锁的问题，不存在加锁释放锁操作，没有因为可能出现死锁而导致的性能消耗
         * 不存在多进程或者多线程导致的切换而消耗CPU
         * 2.单进程单线程弊端
         * 无法发挥多核CPU性能，不过可以通过在单机开多个Redis实例来完善
         * 3.IO多路复用技术
         * redis 采用网络IO多路复用技术来保证在多连接的时候， 系统的高吞吐量。
         * 多路指的是多个socket连接，复用指的是复用一个线程。
         * 多路复用主要有三种技术：select，poll，epoll。epoll是最新的也是目前最好的多路复用技术。
         * 这里“多路”指的是多个网络连接，“复用”指的是复用同一个线程。
         * 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求（尽量减少网络IO的时间消耗），
         * 且Redis在内存中操作数据的速度非常快（内存内的操作不会成为这里的性能瓶颈），
         * 主要以上两点造就了Redis具有很高的吞吐量。
         *四.Redis高并发快总结
         * 1. Redis是纯内存数据库，一般都是简单的存取操作，线程占用的时间很多，
         *    时间的花费主要集中在IO上，所以读取速度快。
         * 2. 再说一下IO，Redis使用的是非阻塞IO，IO多路复用，使用了单线程来轮询描述符，
         *    将数据库的开、关、读、写都转换成了事件，减少了线程切换时上下文的切换和竞争。
         * 3. Redis采用了单线程的模型，保证了每个操作的原子性，也减少了线程的上下文切换和竞争。
         * 4. 另外，数据结构也帮了不少忙，Redis全程使用hash结构，读取速度快，
         *    还有一些特殊的数据结构，对数据存储进行了优化，如压缩表，对短数据进行压缩存储，
         *    再如，跳表，使用有序的数据结构加快读取的速度。
         * 5. 还有一点，Redis采用自己实现的事件分离器，效率比较高，
         *    内部采用非阻塞的执行方式，吞吐能力比较大。
         */

    }
}
